<script setup lang="ts">
import { ref, computed } from 'vue'

const text = ref('')

// 统计指标
const stats = computed(() => {
  const content = text.value

  // 字符数（含空格）
  const charsWithSpaces = content.length

  // 字符数（不含空格）
  const charsWithoutSpaces = content.replace(/\s/g, '').length

  // 单词数（按空格分割，排除空字符串）
  const words = content.trim()
    ? content.trim().split(/\s+/).filter(word => word.length > 0).length
    : 0

  // 行数（按换行符分割，排除空行）
  const lines = content.trim()
    ? content.split('\n').filter(line => line.trim().length > 0).length
    : 0

  // 段落数（按连续的换行符分割，排除空段落）
  const paragraphs = content.trim()
    ? content.split(/\n\s*\n/).filter(para => para.trim().length > 0).length
    : 0

  return {
    charsWithSpaces,
    charsWithoutSpaces,
    words,
    lines,
    paragraphs
  }
})

const statItems = computed(() => [
  {
    label: '字符数（含空格）',
    value: stats.value.charsWithSpaces
  },
  {
    label: '字符数（不含空格）',
    value: stats.value.charsWithoutSpaces
  },
  {
    label: '单词数',
    value: stats.value.words
  },
  {
    label: '行数',
    value: stats.value.lines
  },
  {
    label: '段落数',
    value: stats.value.paragraphs
  }
])

// 示例文本
const sampleText = '这是一个示例文本，用于展示文本统计工具的功能。\n' +
'这是第一段的第二行。\n\n' +
'这是第二段。它包含了 some English words。\n' +
'这一段还有第二行。\n\n' +
'最后一段，展示了多种语言混合的情况。\n' +
'It includes both Chinese and English text.\n' +
'最后一行结束。'

const loadSample = () => {
  text.value = sampleText
}
</script>

<template>
  <div class="p-4 mx-auto max-w-7xl">
    <n-card>
      <template #header>
        <div class="text-2xl font-bold">文本统计</div>
        <p class="mt-2 text-sm text-gray-600 dark:text-gray-400">
          实时统计文本的字符数、单词数、行数和段落数
        </p>
      </template>

      <div class="space-y-6">
        <!-- 输入区域 -->
        <div class="space-y-2">
          <div class="flex items-center justify-between">
            <h3 class="font-medium">输入文本</h3>
            <n-button
              tertiary
              type="primary"
              size="small"
              @click="loadSample"
            >
              加载示例
            </n-button>
          </div>
          <n-input
            v-model:value="text"
            type="textarea"
            :autosize="{ minRows: 10, maxRows: 20 }"
            placeholder="在此输入或粘贴文本..."
          />
        </div>

        <!-- 统计结果 -->
        <div class="grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5">
          <n-card
            v-for="item in statItems"
            :key="item.label"
            size="small"
            :bordered="false"
            class="bg-gray-50 dark:bg-gray-800"
          >
            <div class="space-y-1 text-center">
              <div class="text-sm text-gray-600 dark:text-gray-400">{{ item.label }}</div>
              <div class="text-2xl font-bold text-primary">{{ item.value }}</div>
            </div>
          </n-card>
        </div>
      </div>
    </n-card>
  </div>
</template>

<style scoped>
:deep(.n-input) {
  font-family: monospace;
}
</style> 